
/** 用户动态菜单节点 */
export interface MenuMap {
    /** 组件在项目中的地址 */
    component?: string | null;
    /** icon 名称 */
    icon?: string;
    /** 菜单ID */
    menuId: number;
    /** 菜单名称 */
    menuName: string;
    /** 菜单分级 */
    //menuType: number;
    /** 菜单父级ID */
    parentId?: number;
    /** 路由地址 */
    path: string;
    children?: MenuMap[];
    /** 显示隐藏 */
    //visibleFlag?: boolean;
    /** 禁用标识 */
    //disabledFlag?: boolean;
    /** 访问权限 */
    //webPerms?: string | null;
}
export const buildMenuTree = (menuList: any[]): MenuMap[] => {
    /* 1. 将 menu_list 中的单个菜单项 转换成 单个路由节点 */
    const convertToMenu = (menu: any): MenuMap => {
        return {
          component: menu.module_link, // 生成路径
          menuName: menu.module_name, // 生成名称
          menuId: menu.module_id,
          parentId: menu.module_parent_id,
          path: menu.module_link, // 生成路径
          children: [], // 初始化子路由数组
        };
    };

    /* 2. 遍历 menu_list ,调用 convertToRouter 函数,将 所有菜单项 转换 路由节点 */
    const menuTreeList = menuList.map(menu => convertToMenu(menu));
    /* 3. 构建父子路由关系（根据 pid 和 id 匹配）,生成完整的路由 */
    const buildMenuTrees = (menus: MenuMap[]): MenuMap[] => {
        const topMenus: MenuMap[] = [{menuId:0,menuName:'首页',parentId:0,path:'/home',component:"/home",children:[]}]; // 顶级路由（pid=0）
        const menuMap = new Map<string, MenuMap>(); // 用 id 映射路由，方便查找

        // 先将所有路由存入 map
        menus.forEach(menu => {
            menuMap.set(String(menu.menuId), menu);
        });

        // 遍历路由，挂载到父路由的 children 中
        menus.forEach(menu => {
            const parentId = menu.parentId;
            if (parentId === 0) {
                topMenus.push(menu);// 顶级路由直接加入 topRoutes
            } else {
                // 查找父路由，加入其 children
                const parentMenu = menuMap.get(String(parentId));//获取路由对象的引用
                if (parentMenu) {
                    parentMenu.children?.push(menu);
                }
            }
        });
        return topMenus;
    };

    // 生成最终的嵌套路由
    return buildMenuTrees(menuTreeList);
}